/*
 * tcpsession.h
 *
 *  Created on: 2012-8-2
 *      Author: wx
 */

#ifndef TCPSESSION_H_
#define TCPSESSION_H_

typedef int bpf_int32;
typedef unsigned bpf_u_int32;
typedef unsigned short u_short;
typedef unsigned int u_int32;
typedef unsigned short u_int16;
typedef unsigned char u_int8;

//pcap文件头结构体
struct pcap_file_header
{
	bpf_u_int32	magic;			/* 0xa1b2c3d4 */
	u_short		version_major;	/* magjor Version 2 */
	u_short		version_minor;	/* magjor Version 4 */
	bpf_int32	thiszone;		/* gmt to local correction */
	bpf_u_int32	sigfigs;		/* accuracy of timestamps */
	bpf_u_int32	snaplen;		/* max length saved portion of each pkt */
	bpf_u_int32	linktype;		/* data link type (LINKTYPE_*) */
};

//时间戳
struct time_val
{
	int tv_sec;         /* seconds 含义同 time_t 对象的值 */
	int tv_usec;        /* and microseconds */
};

//pcap数据包头结构体
struct pcap_pkthdr
{
	struct time_val ts;  /* time stamp */
	bpf_u_int32 caplen;  /* length of portion present */
	bpf_u_int32 len;     /* length this packet (off wire) */
};

//数据帧头
typedef struct FramHeader_s
{
	//Pcap捕获的数据帧头
	u_int8	DstMAC[6];	 //目的MAC地址
	u_int8	SrcMAC[6];	 //源MAC地址
	u_short FrameType;   //帧类型
} FramHeader_t;

//IP数据报头
typedef struct IPHeader_s
{
	//IP数据报头
	u_int8	 Ver_HLen;       //版本+报头长度
	u_int8	 TOS;            //服务类型
	u_int16	 TotalLen;       //总长度
	u_int16	 ID;	         //标识
	u_int16	 Flag_Segment;   //标志+片偏移
	u_int8	 TTL;            //生存周期
	u_int8	 Protocol;       //协议类型
	u_int16	 Checksum;       //头部校验和
	u_int32	 SrcIP;	         //源IP地址
	u_int32	 DstIP;	         //目的IP地址
} IPHeader_t;


//TCP数据报头
typedef struct TCPHeader_s
{
	//TCP数据报头
	u_int16	 SrcPort;	     //源端口
	u_int16	 DstPort;	     //目的端口
	u_int32	 SeqNO;	         //序号
	u_int32	 AckNO;	         //确认号
	u_int8	 HeaderLen;	     //数据报头的长度(4 bit) + 保留(4 bit)
	u_int8	 Flags;	         //标识TCP不同的控制消息
	u_int16	 Window;	     //窗口大小
	u_int16	 Checksum;	     //校验和
	u_int16	 UrgentPointer;  //紧急指针
} TCPHeader_t;

//数据包结构
typedef struct TCPSession_s
{
	u_int32	PkgNo;				//包序号
	struct time_val	ts;			//时间戳
	u_int8 	DstMAC[6];			//目的MAC地址
	u_int8 	SrcMAC[6];			//源MAC地址
	u_int16	TotalLen;			//IP包总
	u_int16	ID;					//IP包ID
	u_int32	SrcIP;				//源IP
	u_int32	DstIP;				//目标IP
	u_int16	SrcPort;			//源端口
	u_int16	DstPort;			//目标端口
	u_int32	SeqNo;				//序号
	u_int32 AckNo;				//确认号
	u_int8	Flags;				//TCP控制标志
	u_int16	DataLen;			//TCP数据长度
	char	*Payload;			//TCP数据
	struct TCPSession_s *next;	//下一个包
} TCPSession_t;


//TCP标志位
enum TCP_FLAGS
{
	TCPFLAG_FIN = 0x01,
	TCPFLAG_SYN = 0x02,
	TCPFLAG_RST = 0x04,
	TCPFLAG_PSH = 0x08,
	TCPFLAG_ACK = 0x10,
	TCPFLAG_UTG = 0x20
};

//错误代码
enum TCPSESSION_ERROR
{
	TSERR_UNKNOWN = -1,
	TSERR_FILEOPEN = -2,
	TSERR_FILEREAD = -3,
	TSERR_UNSUPPORTED = -4,
	TSERR_OUTOFINDEX = -5,
	TSERR_OVERFLOW = -6
};

//初始化
//成功返回0
int tcpsess_init();

//读取指定的pcap文件进行解析
//成功返回0。失败返回错误码。
int tcpsess_parse_pcap(const char * pcap_filename);

//获取会话数组
TCPSession_t ** tcpsess_get_sessions();

//获取会话数量
int tcpsess_get_sess_count();

//释放解析后的数据所占用的内存
void tcpsess_close();

//获取cap文件头数据
struct pcap_file_header * tcpsess_get_cap_header();

//删除指定session
//成功返回0，失败返回错误代码。
int tcpsess_del_session(int index);

//按照时序获取所有会话数据。
//成功返回数据长度，失败返回错误代码。
int tcpsess_get_sess_data(TCPSession_t *session, char * buf, int bufsize);

//返回所有请求数据
//成功返回数据长度，失败返回错误代码。
int tcpsess_get_req_data(TCPSession_t *session, char * buf, int bufsize);

//返回所有应答数据
//成功返回数据长度，失败返回错误代码。
int tcpsess_get_rsp_data(TCPSession_t *session, char * buf, int bufsize);

#endif /* TCPSESSION_H_ */
